#pragma once
#include<unistd.h>
#include"data.hpp"

extern cloud::DataManager* _data; 

namespace cloud
{
    class HotManager
    {
    public:
        HotManager()
        {
            
            Config* config = Config::GetInstance();
            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHotTime();
            
            Cloud::FileUtil tmp1(_back_dir); 
            Cloud::FileUtil tmp2(_pack_dir);
            tmp1.CreateDirectory();
            tmp2.CreateDirectory();
        }

        //非热点文件返回真，热点文件返回假
        bool HotJudge(const std::string& filename) //filename是文件路径
        {
            Cloud::FileUtil fu(filename);
            time_t last_atime = fu.LastAccTime(); //获取最后一次访问时间
            time_t cur_time = fu.LastModTime(); //获取当前系统时间
            if(cur_time - last_atime > _hot_time) //对比时间
            {
                return true;
            }
            return false;
        }

        //运行
        bool RunModule()
        {
            while(1)
            {
                //1.遍历备份目录，获取所有文件名
                Cloud::FileUtil fu(_back_dir);
                std::vector<std::string> arry;
                fu.ScanDirectory(&arry); //遍历备份文件夹把路径放到数组中

                //2.遍历判断文件时间确认是否为非热点文件
                for(auto& a : arry)
                {
                    if( HotJudge(a) == false ) //如果是热点文件不需要处理
                    {
                        continue;
                    }
                    
                    //3.1获取文件备份信息
                    BackupInfo bi;
                    if( _data->GetOneByRealPath(a,&bi) == false )
                    {
                        //走到这里说明这个文件存在但是没有备份信息
                        bi.NewBackupInfo(a); //设置一个新的备份信息出来
                    }

                    //3.对非热点文件进行压缩处理
                        Cloud::FileUtil tmp(a);
                        tmp.Compress(bi.pack_path);

                    //4.删除源文件，修改备份信息
                        tmp.Remove();
                        bi.pack_flag = true;
                        _data->Update(bi);
                }
            }
            usleep(1000); // 1毫秒，0.1秒 //避免空目录循环遍历从而消耗CPU资源过高
           
        }
    private:
        std::string _back_dir; //备份文件路径
        std::string _pack_dir;  //压缩文件路径
        std::string _pack_suffix; //压缩包后缀
        int _hot_time;
    };
}